#include <bits/stdc++.h>
using namespace std;
//https://www.nowcoder.com/practice/22948c2cad484e0291350abad86136c3?tpId=37&tqId=21331&ru=/exam/oj
// int gcd(int a,int b)
// {
//     while(a>0||b>0)
//     {
//         if(b==0)break;
//         a%=b;
//         if(a==0)break;
//         b%=a;
//     }
//     return max(a,b);
// }
// int main() {
//     int a,b;
//     cin>>a>>b;
//     cout<<(a*b/gcd(a,b))<<endl;
//     return 0;
// }

//https://www.nowcoder.com/practice/eac1c953170243338f941959146ac4bf?tpId=196&tqId=37143&ru=/exam/oj
// class Solution {
//     public:
//         int MLS(vector<int>& arr) {
//             sort(arr.begin(),arr.end());
//             int maxl=1,curlength=1;

//             for(int right=1;right<arr.size();right++)
//             {
//                 if(arr[right-1]+1==arr[right])
//                     curlength++;
//                 else if(arr[right]!=arr[right-1])
//                 {
//                     maxl=max(maxl,curlength);
//                     curlength=1;
//                 }
//             }
//             return max(maxl,curlength);
//         }
//     };
// class Solution {
//     public:
//       int MLS(vector<int> arr) {
//           sort(arr.begin(), arr.end());
//           arr.erase(unique(arr.begin(),arr.end()),arr.end());
//           vector<int> a(arr);
//           int maxl = 0;
//           int left=0,right=0;
//           //把right++移除，否则会导致在某些情况下多加一次
//           //在循环内修改循环变量的值时，更改的情况只能出现一次
//           for (left = 0, right = 0; right < arr.size();) {
//               while (right < arr.size() && arr[right] + 1 == arr[right + 1])right++;
//               maxl = max(maxl, right - left + 1);
//               left = right + 1;
//               right = left;//和right++只能出现一个
//           }
//           return maxl;
//       }
//   };
// class Solution {
//     public:
//       int MLS(vector<int> arr) {
//           sort(arr.begin(), arr.end());
//           arr.erase(unique(arr.begin(),arr.end(),arr.end()));
//           int ret = 0;
//           for (int i = 0; i < arr.size();) {
//               int j = i + 1, count = 1;
//               while (j < arr.size()) {
//                   if (arr[j-1] + 1 == arr[j]) {
//                       j++, count++;
//                   }
//                 //   else if(arr[j-1] == arr[j])j++;//可以和上面的erase选择一个
//                   else break;
//               }
//               ret = max(ret, count);
//               i=j;
//           }
//           return ret;
//       }
//   };
// int main()
// {
//     vector<int> arr({1, 1, 2, 3, 5, 6, 4, 7, 9, 10});
//     cout<<Solution().MLS(arr)<<endl;
//     return 0;
// }

//https://www.nowcoder.com/practice/9740ce2df0a04399a5ade1927d34c1e1?tpId=230&tqId=38954&ru=/exam/oj
//路径问题->dp
int m, n;
const int N = 510;
char a[N][N];
int dp[N][N];
int main() {
    cin >> m >> n;
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            cin >> a[i][j];
        }
    }

    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            int grade = 0;
            if (a[i][j] == 'l')grade = 4;
            else if (a[i][j] == 'o')grade = 3;
            else if (a[i][j] == 'v')grade = 2;
            else if (a[i][j] == 'e')grade = 1;

            dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grade;
        }
    }
    cout << dp[m][n] << endl;
    return 0;
}